Cieľ¶
Cieľom tohto reportu je popísať prípravu dát, vytvorenie a otestovanie modelu, ktorý dokáže predikovať počet strelených gólov v nasledujúcej sezóne pre hráča v NHL.
Príprava vstupných dát¶
Zdrojový dataset obsahuje štatistiky hráčov NHL za sezóny 2004-2018. Vytvoríme si nový dataset, ktorý bude obsahovať nasledovné dáta z pôvodného datasetu:
- Nick - identifikácia hráča
- Age - vek
- GP - odohrané zápasy
- ATOI - priemerný počet minút na ľade, zaokrúhlime na celé číslo
- Season - sezóna
- G - góly - budú slúžiť ako target pri trénovaní modelu a ako kontrola predikcie pri testovaní modelu
Z nového datasetu odstránime hráčov, ktorí odohrali menej ako 4 sezóny, aby sme mali pre trénovanie modelu aspoň nejaké zaručené množstvo dát pre každého hráča, čo by malo viesť k lepšej predikcii modelu.
Dáta obsahujú extrémne hodnoty (outliers), no jedná sa o hodnoty, ktoré nesú informáciu a nejedná sa o chybu v dátach, (napr. z predchádzajúceho reportu vieme, že Chris Chelios hral v NHL ako 48-ročný). Nie je teda potrebné ich odstrániť ani nijako riešiť.
Dáta nepotrebujú žiadne čistenie ani opravy, hodnoty pre dáta nechýbajú a nenachádzajú sa žiadne duplicitné riadky. Dáta sú konzistentné.
Popis finálnych dát¶
Nick - reprezentuje kategorický prediktor (zakódujeme pomocou One hot encodingu)
Age, GP, ATOI, Season - reprezentujú číselný prediktor
G - reprezentuje target
Modelovanie¶
Na vytvorenie trénovacích a testovacích dát použijeme náš nový dataset, ktorý rozdelíme následovne:
- Trénovacie dáta: všetky dáta zo sezón hráčov okrem ich poslednej.
- Testovacie dáta: posledná sezóna pre každého hráča, ktorá sa nachádza v datasete.
Príklad:
Hráč Sidney Crosby (vynechaný stĺpec Nick:crosbsi01). Posledný riadok reprezentuje jeho poslednú sezónu (v datasete) - testovacie dáta, zbytok sú dáta na trénovanie:
| Age | GP | ATOI | Season | G |
|---|---|---|---|---|
| 18 | 81 | 20 | 2006 | 39 |
| 19 | 79 | 21 | 2007 | 36 |
| 20 | 53 | 21 | 2008 | 24 |
| 21 | 77 | 22 | 2009 | 33 |
| 22 | 81 | 22 | 2010 | 51 |
| 23 | 41 | 22 | 2011 | 32 |
| 24 | 22 | 18 | 2012 | 8 |
| 25 | 36 | 21 | 2013 | 15 |
| 26 | 80 | 22 | 2014 | 36 |
| 27 | 77 | 20 | 2015 | 28 |
| 28 | 80 | 20 | 2016 | 36 |
| 29 | 75 | 20 | 2017 | 44 |
| 30 | 82 | 21 | 2018 | 29 |
Máme pripravené dáta na natrénovanie modelu a aj na jeho otestovanie. Vytvoríme si model lineárnej regresie, ktorý natrénujeme na trénovacom datasete.
Pipeline(steps=[('preprocessor',
ColumnTransformer(transformers=[('categ', OneHotEncoder(),
['Nick']),
('num', 'passthrough',
['Age', 'GP', 'ATOI',
'Season'])])),
('regressor', LinearRegression())])In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook. On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
Pipeline(steps=[('preprocessor',
ColumnTransformer(transformers=[('categ', OneHotEncoder(),
['Nick']),
('num', 'passthrough',
['Age', 'GP', 'ATOI',
'Season'])])),
('regressor', LinearRegression())])ColumnTransformer(transformers=[('categ', OneHotEncoder(), ['Nick']),
('num', 'passthrough',
['Age', 'GP', 'ATOI', 'Season'])])['Nick']
OneHotEncoder()
['Age', 'GP', 'ATOI', 'Season']
passthrough
LinearRegression()
Vyhodnotenie modelu¶
Predikciu modelu otestujeme na vytvorenom testovacom datasete, ktorý obsahuje poslednú sezónu hráča a bude simulovať nasledujúcu sezónu v predikcii.
Pre jednoduchšie posúdenie modelu, zaokrúhlime predikcie na celé čísla a prípadné záporné čísla nastavíme na 0.
Predikcia počtu strelených gólov pre hráčov v nasledujúcej sezóne¶
Pozrieme sa na to, ako model dokázal predikovať presný počet gólov pre hráčov a ako dokázal predikovať s toleranciou 5 gólov.
Presná predikcia¶
Presná predikcia:
- 0-20 gólov: 414 správne predikovaných gólov z 1251 - 33% správnosť predikcie.
- 21-49 gólov: 1 správna predikcia z 91 - 1,1% správnosť predikcie.
Celkovo: 30,9% správnosť presnej predikcie.
Predikcia s toleranciou 5 gólov¶
Predikcia s toleranciou 5 gólov:
- 0-20 gólov: 1092 predikovaných gólov v tolerancii z 1251 - 87,3% správnosť predikcie.
- 21-49 gólov: 28 predikcií v tolerancii z 91 - 31,9% správnosť predikcie.
Celkovo: 83,5% správnosť predikcie s toleranciou 5 gólov.
Predikcia skúsení hráči vs. veteráni¶
Hráčov (1342) rozdelíme do dvoch skupín:
- Skúsení hráči (791) - hráči, ktorí odohrali menej ako 7 sezón (a viac ako 4)
- Veteráni (551) - hráči, ktorí odohrali 7 a viac sezón
Pozrieme sa na to, ako model dokázal pre tieto skupiny predpovedať strelené góly v nasledujúcej sezóne pre rôzne tolerancie.
Vidíme, že model dokázal predpovedať pre skúsených hráčov správne:
- 50% strelených gólov v ďalšej sezóne s toleranciou menej ako 1 gól
- 75% strelených gólov s toleranciou 3 góly.
- skoro 90% strelených gólov s toleranciou 6 gólov.
U veteránov pozorujeme odlišné výsledky, správna predikcia:
- 50% strelených gólov s toleranciou menej ako 2 góly
- 75% strelených gólov s toleranciou menej ako 5 gólov.
- 90% strelených gólov s toleranciou 8 gólov.
Záver¶
Model bol natrénovaný na hráčoch, ktorí odohrali aspoň 4 sezóny. Celkový počet hráčov, pre ktorých prebiehalo trénovanie a predikcia - 1342
Na testovacích dátach sme získali tieto výsledky:
Priemerná chyba predikcie vychádza na 2,8 gólu.
Počet presne predpovedaných gólov: 415 - 30.92% z celku
Počet predpovedí v tolerancii 5 gólov: 1121 - 83.53% z celku
Model vykazoval väčšiu presnosť pre hráčov, ktorí za sezónu nedávajú veľa gólov (pod 20), naopak pri hráčoch, ktorí dávajú veľa gólov (>20) sa model neprejavoval ako spoľahlivý.
Boli vyskúšané viaceré spôsoby pri trénovaní modelu (RandomForestRegressor, MLPRegressor, Lasso zo sklearn lib), no LinearRegression preukázala najlepšie výsledky.
Problémom pre model by mohli byť takzvané "breakout seasons", teda sezóny, kedy hráč prejaví výrazné zlepšenie svojich výkonov v porovnaní s predchádzajúcimi sezónami. Pre zaujímavosť, pri testovaní modelu bola najväčšia chyba v predikcii pre hráča William Karlsson, ktorý skóroval v sezónach 2015/16/17 - 3, 9, 6 gólov. Model pre Karlssona predikoval, že v sezóne 2018 skóruje 10-krát, no skóroval až nečakaných 43 gólov a spomedzi všetkých testovaných hráčov dosiahol najväčšiu chybu v predikcii - 33 gólov.